package com.songlanyun.modules.freebaggive.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.songlanyun.common.enums.IntegralConstant;
import com.songlanyun.common.enums.MemberConstant;
import com.songlanyun.common.exception.RRException;
import com.songlanyun.common.utils.DateUtils;
import com.songlanyun.modules.account.service.UserIdentityAssetService;
import com.songlanyun.modules.disabilityauth.entity.DisabilityAuthEntity;
import com.songlanyun.modules.disabilityauth.service.DisabilityAuthService;
import com.songlanyun.modules.freebag.entity.FreeBag;
import com.songlanyun.modules.freebag.service.FreeBagService;
import com.songlanyun.modules.integralrecord.entity.IntegralRecord;
import com.songlanyun.modules.integralrecord.service.IntegralRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.songlanyun.common.utils.PageUtils;
import com.songlanyun.common.utils.Query;

import com.songlanyun.modules.freebaggive.dao.FreeBagGiveDao;
import com.songlanyun.modules.freebaggive.entity.FreeBagGiveEntity;
import com.songlanyun.modules.freebaggive.service.FreeBagGiveService;


@Service("freeBagGiveService")
public class FreeBagGiveServiceImpl extends ServiceImpl<FreeBagGiveDao, FreeBagGiveEntity> implements FreeBagGiveService {

    @Autowired
    private DisabilityAuthService disabilityAuthService;

    @Autowired
    private FreeBagService freeBagService;


    @Autowired
    private IntegralRecordService integralRecordService;


    @Override
    public FreeBagGiveEntity create(FreeBagGiveEntity entity) {
        this.baseMapper.insert(entity);
        return entity;
    }

    @Override
    public FreeBagGiveEntity modify(FreeBagGiveEntity entity) {
        this.baseMapper.updateById(entity);
        return entity;
    }


    @Override
    public void remove(Long id) {

    }

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<FreeBagGiveEntity> page = this.page(
                new Query<FreeBagGiveEntity>().getPage(params),
                new QueryWrapper<FreeBagGiveEntity>()
        );

        return new PageUtils(page);
    }

    /**
     * 首次发放
     *
     * @param userId
     */
    @Override
    public void firstGive(Long userId) {
        DisabilityAuthEntity disabilityAuthEntity = disabilityAuthService.loadByUserId(userId);
        if (ObjectUtil.isNull(disabilityAuthEntity)) {
            throw new RRException("没有获得残疾认证不能发放");
        }
        if (!disabilityAuthEntity.isOk()) {
            throw new RRException("残疾认证没有审核通过");
        }

        Integer benefitsPackageId = disabilityAuthEntity.getBenefitsPackageId();
        FreeBag freeBag = freeBagService.loadById(benefitsPackageId, true);
        if (!freeBag.getHasEffect()) {
            throw new RRException("福利包已停用不能发放");
        }
        FreeBagGiveEntity freeBagGiveEntity = new FreeBagGiveEntity();
        freeBagGiveEntity.setUserId(userId);
        freeBagGiveEntity.setFreeType(freeBag.getFreeType());
        freeBagGiveEntity.setFreeNum(freeBag.getFreeNum());
        freeBagGiveEntity.setMonthUseNum(0);
        freeBagGiveEntity.setIntegralType(freeBag.getIntegralType());
        freeBagGiveEntity.setIntegralNum(freeBag.getIntegralNum());
        Date now = new Date();
        String nowDataStr = DateUtil.format(now, "yyyy-MM-dd");
        Date nowData = DateUtils.stringToDate(nowDataStr, "yyyy-MM-dd");
        freeBagGiveEntity.setGiveDate(nowData);
        freeBagGiveEntity.setGiveTime(now);
        this.create(freeBagGiveEntity);

        if (freeBagGiveEntity.getIntegralNum().compareTo(BigDecimal.ZERO) > 0) {
//            IntegralRecord record = new IntegralRecord(disabilityAuthEntity.getUserId(), freeBagGiveEntity.getIntegralNum(), IntegralConstant.InnerMode.WELFARE,
//                    IntegralConstant.IntegralModelType.WELFARE, freeBagGiveEntity.getId(), "认证通过,配置的福利获得积分");
//            record.setRemark("认证通过,配置的福利获得积分");
//            integralRecordService.inner(record);
        }
    }


    /**
     * 每月发放
     */
    @Override
    public void monthGive(DisabilityAuthEntity disabilityAuthEntity) {

        if (ObjectUtil.isNull(disabilityAuthEntity)) {
            return;
            //throw new RRException("没有获得残疾认证不能发放");
        }
        if (!disabilityAuthEntity.isOk()) {
            return;
            //throw new RRException("残疾认证没有审核通过");
        }
        Integer benefitsPackageId = disabilityAuthEntity.getBenefitsPackageId();
        FreeBag freeBag = freeBagService.loadById(benefitsPackageId, false);
        if (ObjectUtil.isNull(freeBag)){
            return;
        }
        if (!freeBag.getHasEffect()) {
            return;
            //throw new RRException("福利包已停用不能发放");
        }

        FreeBagGiveEntity last = this.loadLast(disabilityAuthEntity.getUserId());
        if (ObjectUtil.isNotNull(last)) {
            if (last.isOneFree()) {
                if (freeBag.isOneFree()) {
                    return;
                }
            }
        }


        FreeBagGiveEntity freeBagGiveEntity = new FreeBagGiveEntity();
        freeBagGiveEntity.setUserId(disabilityAuthEntity.getUserId());
        freeBagGiveEntity.setFreeType(freeBag.getFreeType());
        freeBagGiveEntity.setFreeNum(freeBag.isOneFree() ? 0 : freeBag.getFreeNum());
        freeBagGiveEntity.setMonthUseNum(0);
        freeBagGiveEntity.setIntegralType(freeBag.getIntegralType());
        freeBagGiveEntity.setIntegralNum(freeBag.isOneIntegralType() ? BigDecimal.ZERO : freeBag.getIntegralNum());
        Date now = new Date();
        String nowDataStr = DateUtil.format(now, "yyyy-MM-dd");
        Date nowData = DateUtils.stringToDate(nowDataStr, "yyyy-MM-dd");
        freeBagGiveEntity.setGiveDate(nowData);
        freeBagGiveEntity.setGiveTime(now);
        this.create(freeBagGiveEntity);

        if (freeBagGiveEntity.getIntegralNum().compareTo(BigDecimal.ZERO) > 0) {
//            IntegralRecord record = new IntegralRecord(disabilityAuthEntity.getUserId(), freeBagGiveEntity.getIntegralNum(), IntegralConstant.InnerMode.WELFARE,
//                    IntegralConstant.IntegralModelType.WELFARE, freeBagGiveEntity.getId(), "认证通过,配置的福利获得积分");
//            record.setRemark("认证通过,配置的福利获得积分");
//            integralRecordService.inner(record);
        }

    }

    @Override
    public Integer getFreeLimit(Long userId) {
        DisabilityAuthEntity disabilityAuthEntity = disabilityAuthService.loadByUserId(userId);
        if (ObjectUtil.isNull(disabilityAuthEntity)) {
            return 0;
        }
        if (!disabilityAuthEntity.isOk()) {
            return 0;
        }
        FreeBagGiveEntity freeBagGiveEntity = this.loadLast(userId);
        if (ObjectUtil.isNull(freeBagGiveEntity)) {
            return 0;
        }
        if (freeBagGiveEntity.getFreeNum() == 0) {
            return 0;
        }

        return freeBagGiveEntity.getFreeNum() - freeBagGiveEntity.getMonthUseNum();

    }


    @Override
    public FreeBagGiveEntity loadLast(Long userId) {
        FreeBagGiveEntity freeBagGiveEntity = this.baseMapper.selectOne(new LambdaQueryWrapper<FreeBagGiveEntity>().eq(FreeBagGiveEntity::getUserId, userId).orderByDesc(FreeBagGiveEntity::getGiveTime).last("limit 1"));
        return freeBagGiveEntity;
    }

    @Override
    public void useFree(Long userId) {
        FreeBagGiveEntity freeBagGiveEntity = this.loadLast(userId);
        if (ObjectUtil.isNotNull(freeBagGiveEntity)) {
            if (freeBagGiveEntity.getFreeNum() > 0 && freeBagGiveEntity.getFreeNum() > freeBagGiveEntity.getMonthUseNum()) {
                freeBagGiveEntity.setMonthUseNum(freeBagGiveEntity.getMonthUseNum() + 1);
                this.modify(freeBagGiveEntity);
            }
        }
    }

    @Override
    public void batchProcess(List<?> data) {
        data.forEach(o -> {
            monthGive((DisabilityAuthEntity) o);
        });

    }


}
